package com.chenwc.util.translate.baidu;

import com.alibaba.fastjson2.JSONObject;
import com.chenwc.util.Util;
import com.chenwc.util.httputil.httpurlconnection.RestMock;
import com.chenwc.util.translate.baidu.constant.BaiDuConstant;
import com.chenwc.util.translate.baidu.enumeration.BaiDuDomain;
import com.chenwc.util.translate.baidu.enumeration.BaiDuErrorCode;
import com.chenwc.util.translate.baidu.enumeration.BaiDuLang;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 翻译帮助工具 - 百度
 *
 * @author chenwc
 * @package com.chenwc.util.translate.baidu
 * @project wso2-sinicization
 * @date 2024/5/25
 */
public class TranslateByBaiDuUtil {
    private static final Logger log = LoggerFactory.getLogger(TranslateByBaiDuUtil.class);

    /**
     * 百度自动判断识别语言体系
     *
     * @param text       需要翻译的文本
     * @param targetLang 目标语言
     * @return 翻译后的文本
     */
    public static String translate(String text, BaiDuLang targetLang) {
        return translate(text, BaiDuLang.AUTO, targetLang, null);
    }

    /**
     * 百度翻译
     *
     * @param text       需要翻译的文本
     * @param srcLang    源语言
     * @param targetLang 目标语言
     * @return 翻译后的文本
     */
    public static String translate(String text, BaiDuLang srcLang, BaiDuLang targetLang, BaiDuDomain baiDuDomain) {

        if (null == targetLang) {
            targetLang = BaiDuLang.ZH;
        }

        String salt = UUID.randomUUID().toString().replace("-", "").substring(0, 10);
        //String qString = URLEncoder.encode(text, ENCODING).replace("+", "%20");
        //垂直领域sign（电子科技领域）
        String sign = "";
        if (baiDuDomain != null){
            sign = BaiDuConstant.APP_ID + text + salt + baiDuDomain.getValue() + BaiDuConstant.APP_KEY;
        }
        else {
            sign = BaiDuConstant.APP_ID + text + salt + BaiDuConstant.APP_KEY;
        }
        //通用领域sign
        //String sign = BaiDuConstant.APP_ID + text + salt + BaiDuConstant.APP_KEY;
        sign = Util.getMd5(sign);
        Map<String, String> parameter = new HashMap<>();
        parameter.put("q", text);
        parameter.put("from", srcLang.getValue());
        parameter.put("to", targetLang.getValue());
        parameter.put("appid", BaiDuConstant.APP_ID);
        parameter.put("salt", salt);
        parameter.put("sign", sign);
        if (baiDuDomain != null){
            parameter.put("domain", baiDuDomain.getValue());
        }

        String resultJson = "";
        if (baiDuDomain != null){
            resultJson = RestMock.sendGet(BaiDuConstant.FIELD_TRANSLATE_URL, new HashMap<>(), parameter);
        }
        else {
            resultJson = RestMock.sendGet(BaiDuConstant.TRANSLATE_URL, new HashMap<>(), parameter);
        }
        log.info("请求响应：{}", resultJson);
        JSONObject jsonObject = JSONObject.parseObject(resultJson);
        int errorCode = jsonObject.containsKey("error_code") ? jsonObject.getIntValue("error_code") : BaiDuErrorCode.C_52000.getCode();
        log.info("翻译结果: {}", BaiDuErrorCode.getErrorCodeMessage(errorCode));
        if (errorCode != BaiDuErrorCode.C_52000.getCode()){
            throw new RuntimeException(BaiDuErrorCode.getErrorCodeMessage(errorCode));
        }
        JSONObject transResult = jsonObject.containsKey("trans_result") ? jsonObject.getJSONArray("trans_result").getJSONObject(0) : new JSONObject();
        String result = transResult.containsKey("dst") ? transResult.getString("dst") : text;

        log.info("dst:---->" + result);
        return result;
    }

    /**
     * 百度翻译: 英文-->简体中文
     *
     * @param text 需要翻译的文本
     * @return 翻译后的文本
     */
    public static String en2zh(String text) {
        return translate(text, BaiDuLang.EN, BaiDuLang.ZH, null);
    }

    /**
     * 百度翻译: 简体中文-->英文
     *
     * @param text 需要翻译的文本
     * @return 翻译后的文本
     */
    public static String zh2en(String text) {
        return translate(text, BaiDuLang.ZH, BaiDuLang.EN, null);
    }

    /**
     * 百度翻译: 日文-->简体中文
     *
     * @param text 需要翻译的文本
     * @return 翻译后的文本
     */
    public static String jp2zh(String text) {
        return translate(text, BaiDuLang.JP, BaiDuLang.ZH, null);
    }

    /**
     * 百度翻译: 简体中文-->日文
     *
     * @param text 需要翻译的文本
     * @return 翻译后的文本
     */
    public static String zh2jp(String text) {
        return translate(text, BaiDuLang.ZH, BaiDuLang.JP, null);
    }

    /**
     * 百度翻译: 简体中文-->繁体中文
     *
     * @param text 需要翻译的文本
     * @return 翻译后的文本
     */
    public static String zh2tw(String text) {
        return translate(text, BaiDuLang.ZH, BaiDuLang.CHT, null);
    }
}
